package com.yn.courseselectionsystem.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yn.courseselectionsystem.pojo.MyAddress;
import com.yn.courseselectionsystem.pojo.User;
import com.yn.courseselectionsystem.service.MailService;
import com.yn.courseselectionsystem.service.impl.UserServiceImpl;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import javax.annotation.Resource;
import javax.jms.Topic;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * @description: TODO
 * @author: Tokyo_God
 * @date: 2020/12/28 8:56
 * Role of:
 * @version: v1.0
 */
@SessionAttributes(value = {"user"})
@Controller
public class UserController {

    @Resource(name = "myAddress")
    MyAddress myAddress;

    //发送邮件好发送html文件
    @Autowired
    private TemplateEngine engine;

    //消息中间件的
    @Autowired
    private JmsMessagingTemplate jms;
    @Autowired
    private Topic topic;
    @Autowired
    private UserServiceImpl userService;
    @Autowired
    private MailService mailService;

    @RequestMapping("/")
    public String login(){
        return "/login";
    }

    /*@GetMapping("/mylogin")
    public String mylogin(){
        return "/login";
    }*/

    /**
     * 进入用户注册页面
     * @return
     */
    @GetMapping("/register")
    public String register(){
        return "/register";
    }

    /**
     * 进入用户聊天页面
     * @return
     */
    @GetMapping("/studentManagement/succPage/user/userChatting")
    public String userChatting(){
        return "/succPage/userChatting";
    }


    /**
     * 进入修改用户信息页面
     * @return
     */
    @GetMapping("/studentManagement/succPage/user/upMyUser")
    public String upMyUser(){
        return "/succPage/upUser";
    }
    /**
     * 修改用户信息,图片仅仅只是更换，不改变数据库里的名字，（后面考虑到后缀名所以更新了）
     * 由于上面写了  @SessionAttributes(value = {"user"})
     * 所以这里的model.getAttribute("user")是到会话里拿user对象
     * @return
     */
    @PostMapping("/studentManagement/succPage/user/upMyUser2")
    public String upMyUser2(User user,MultipartFile file,Model model){
        //原本想  只改变图片 图片名相同（获取原来的图片名）  来覆盖原来的图片   ，
        // 现在要更新数据库改变 图片名，删除掉原来的图片，所以现在的这玩意没用，能够删删图片
        User u=(User)model.getAttribute("user");
        //补全路径
        File mkdir=new File(path);
        if(!mkdir.exists()){
            //如果没这个路径那么就补全来
            mkdir.mkdir();
        }
        //更改图片  不改数据库里的名称
        if(!file.isEmpty()){
            ////////////////////////////删除旧图片///////////////////////////////
            File delFile=new File(path+u.getPhoto());
            //看看文件是否存在
            if(delFile.exists()){
                if(delFile.delete()){
                    System.out.println("原来的图片删除成功");
                }
            }
            ////////////////////////////添加新图片////////////////////////////////
            String []strs=file.getOriginalFilename().split("\\.");
            //获取后缀名
            String fileSuffix=strs[strs.length-1];
            /*System.out.println(strs.length+"||");
            for (String s:strs){
                System.out.println(s);
            }*/

            String fileName=UUID.randomUUID().toString().replace("-","")
                    +"_"+user.getName()+"."+fileSuffix;
            File file1=new File(path+fileName);
            //更新数据库的图片名
            user.setPhoto(fileName);
            try {
                //往指定的地方放入文件
                file.transferTo(file1);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //更新用户
        //更新用户信息    会话会自动更新   所以不需要手动去更新
        userService.upUser(user);
        return "/succPage/upUser";
    }

    /**
     * 退出登入
     * @param session
     * @return
     */
    @GetMapping("/studentManagement/succPage/quitLogin")
    public String quitLogin(HttpSession session, SessionStatus sessionStatus){
        //删除当前会话
        /*session.invalidate();*/

        /*session.removeAttribute("user");*/
        //使当前会话（SessionAttributes）清除

        sessionStatus.setComplete();
        System.out.println("退出登入");
        //重定向到另一个方法  注：默认的转发是 到不了另一个方法的
        return "redirect:/";
    }

    /**
     * 进入成功页面    /学生管理/成功页面/（选课首页）
     * @return
     */
    @RequestMapping("/studentManagement/succPage/win")
    public String win(){
        return "/succPage/win";
    }


    /**
     * 查询邮箱是否在数据库中存在
     * @param email
     * @return
     */
    @GetMapping("/user/selEmail")
    @ResponseBody
    public Integer selEmail(String email){
        User user=userService.selUserEmail(email);
        if(user!=null){
            return 1;
        }else{
            return 0;
        }
    }

    /*String path="D:\\文件流\\学生管理系统图片\\";*/

    private static final String path="D:"+File.separator+"Users"+File.separator
            +"86181"+File.separator+"IDEA-workspace"+File.separator
            +"course-selection-system"+File.separator+
            "src"+File.separator+"main"+File.separator+"webapp"+File.separator;
    /**
     * 注册
     * @param user
     * @return
     */
    @PostMapping("/user/register1")
    public String register1(User user, @RequestParam("file") MultipartFile file ){
        /*String name=file.getOriginalFilename();
        System.out.println("name:"+name);
        String []strs=name.split("\\.");
        System.out.println("length:"+strs.length);
        for (String s:strs) {
            System.out.println(s);
        }*/
        File mkdir=new File(path);
        if(!mkdir.exists()){
            //如果没这个路径那么就补全来
            mkdir.mkdir();
        }
        if(!file.isEmpty()){
            String []strs=file.getOriginalFilename().split("\\.");
            String fileSuffix=strs[strs.length-1];
            /*String fileName=user.getName()+"."+fileSuffix;*/
            String fileName= UUID.randomUUID().toString().replace("-","")
                    +"_"+user.getName()+"."+fileSuffix;
            System.out.println(fileName);

            File file1=new File(path+fileName);
            try {
                //往指定的地方放入文件
                file.transferTo(file1);
            } catch (IOException e) {
                e.printStackTrace();
            }

            //把图片名赋值到user里好让消费者更新
            user.setPhoto(fileName);
            //java对象转json
            JSONObject object= JSONObject.fromObject(user);
            String jsonstr=object.toString();

            System.out.println(jsonstr);
            //发送用户信息给消费者添加  写邮件
            jms.convertAndSend(topic,jsonstr);
        }

        return "/login";
    }

    /**
     * 查询name是否存在
     * @param name
     * @return
     */
    @GetMapping("/user/selUserName")
    @ResponseBody
    public String selUserName(String name){
        User user=userService.selUserName(name);
        if(user!=null){
            return "1";
        }
        return "0";
    }

    /**
     * 生成随机的几位数
     * @param num
     * @return
     */
    public Long randomNumber(int num){
        Long multiple= Long.valueOf(1);
        for(int i=0;i<(num-1);i++){
            multiple=multiple*10;
        }
        Long random= Long.valueOf((int)(Math.random()*9*multiple+1*multiple));
        return random;
    }

    /**
     * 生成验证码
     * @param email
     * @return
     */
    @GetMapping("/user/verificationCode")
    @ResponseBody
    public Long verificationCode(String email){
        //参数是生成几位数
        Long l=randomNumber(4);
        //发送邮件
        mailService.sendMail(email,"邮箱验证","验证码："+l);
        return l;
    }

    /**
     * 用户名登入
     * @param user
     * @return
     */
    @PostMapping("/user/userLogin")
    public String userLogin(User user, Model model){
        User u=userService.loginUser(user.getName(),user.getPwd());
        String site="";
        if(u!=null){
            model.addAttribute("user",u);
            site="/succPage/win";
        }else{
            model.addAttribute("userLoginError","账号不存在或者未激活");
            site="/login";
        }
        return site;
    }

    /**
     * 邮箱登入
     * @param user
     * @param model
     * @return
     */
    @PostMapping("/user/emailLogin")
    public String emailLogin(User user,Model model){
        User u=userService.loginEmail(user.getEmail());
        String site="";
        if(u!=null){
            model.addAttribute("user",u);
            site="/succPage/win";
        }else{
            model.addAttribute("emailLoginError","邮箱不存在或者未激活");
            site="/login";
        }
        return site;
    }


    /**
     * 进入找回密码
     * @return
     */
    @GetMapping("/user/forgetPwd")
    public String forgetPwd(){
        return "/forgetPwd";
    }

    @PostMapping("/user/upPwdName")
    public String upPwdName(String name,Model model){
        User user=userService.selUserName(name);
//        Context context=new Context();
//        context.setVariable("email",user.getEmail());
//        context.setVariable("name",name);
//        context.setVariable("upContent","账户");
//        context.setVariable("address","127.0.0.1");
//        //调用 thymeleaf架包里的方法
//        //指定文件upPwd.html   且设置属性name=‘杜赖’以方便email那边调用
//        String content=engine.process("upPwd",context);
//        System.out.println(content);
///////////////////////////这里得该ip地址//////////////////////////////////////////
        mailService.sendMail(user.getEmail(),"修改密码"
                ,"<a href='http://"+myAddress.getAddress()+":8080/accountUpPwd?email="+user.getEmail()+"'>修改密码</a>");
        /*System.out.println(content);*/
        return "/login";
    }
    /**
     * 进入accountUpPwd页面  由上一个方法的邮箱进入
     * @param email
     * @param model
     * @return
     */
    @GetMapping("/accountUpPwd")
    public String accountUpPwd(String email,Model model){
        model.addAttribute("email",email);
        return "accountUpPwd";
    }


    /**
     * 通过邮箱找回密码
     * @param email
     * @param model
     * @return
     */
    @PostMapping("/user/upPwdEmail")
    public String upPwdEmail(String email,Model model){
        model.addAttribute("email",email);
        model.addAttribute("upContent","邮箱");
        model.addAttribute("address",myAddress.getAddress());
        return "/upPwd";
    }

    /**
     *修改密码  通过邮箱
     * @param email
     * @param pwd
     * @param model
     * @return
     */
    @PostMapping("/user/upPwd/{email}")
    public String upPwd(@PathVariable("email") String email,String pwd,Model model){
        Integer num=userService.upPwd(pwd,email);
        String path="/login";
//        String msg="";
        //直接返回登入页面不需要写信息
        /*if(num>0){
            msg="更新成功";
        }else{
            msg="更新失败";
        }
        model.addAttribute("msg",msg);*/
        return path;
    }

    /**
     * 修改密码  通过name   由于不想写sql语句  通过name修改密码使用查找Email
     * @param email
     * @param pwd
     * @param model
     * @return
     */
    /*@PostMapping("/user/accountUpPwd/{email}")
    public String accountUpPwd(@PathVariable("email") String email,String pwd,Model model){
        //由于不想写通过name修改密码使用查找Email
        System.out.println(email);
       *//* Integer num=userService.upPwd(pwd,email);*//*
        String path="/login";
        return path;
    }*/


}
